﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PACKETPARSERMAX20.CORE
{

    public enum SpellInterruptFlags : uint
    {
        SPELL_INTERRUPT_FLAG_MOVEMENT = 0x01,
        SPELL_INTERRUPT_FLAG_DAMAGE = 0x02,
        SPELL_INTERRUPT_FLAG_INTERRUPT = 0x04,
        SPELL_INTERRUPT_FLAG_AUTOATTACK = 0x08,
        //SPELL_INTERRUPT_FLAG_TURNING      = 0x10              // not turning - maybe _complete_ interrupt on direct damage?
    };

    public enum SpellChannelInterruptFlags : uint
    {
        CHANNEL_FLAG_DAMAGE = 0x0002,
        CHANNEL_FLAG_MOVEMENT = 0x0008,
        CHANNEL_FLAG_TURNING = 0x0010,
        CHANNEL_FLAG_DAMAGE2 = 0x0080,
        CHANNEL_FLAG_DELAY = 0x4000
    };

    public enum SpellAuraInterruptFlags : uint
    {
        AURA_INTERRUPT_FLAG_UNK0 = 0x00000001,   // 0    removed when getting hit by a negative spell?
        AURA_INTERRUPT_FLAG_DAMAGE = 0x00000002,   // 1    removed by any damage
        AURA_INTERRUPT_FLAG_UNK2 = 0x00000004,   // 2
        AURA_INTERRUPT_FLAG_MOVE = 0x00000008,   // 3    removed by any movement
        AURA_INTERRUPT_FLAG_TURNING = 0x00000010,   // 4    removed by any turning
        AURA_INTERRUPT_FLAG_ENTER_COMBAT = 0x00000020,   // 5    removed by entering combat
        AURA_INTERRUPT_FLAG_NOT_MOUNTED = 0x00000040,   // 6    removed by unmounting
        AURA_INTERRUPT_FLAG_NOT_ABOVEWATER = 0x00000080,   // 7    removed by entering water
        AURA_INTERRUPT_FLAG_NOT_UNDERWATER = 0x00000100,   // 8    removed by leaving water
        AURA_INTERRUPT_FLAG_NOT_SHEATHED = 0x00000200,   // 9    removed by unsheathing
        AURA_INTERRUPT_FLAG_UNK10 = 0x00000400,   // 10
        AURA_INTERRUPT_FLAG_UNK11 = 0x00000800,   // 11
        AURA_INTERRUPT_FLAG_UNK12 = 0x00001000,   // 12   removed by attack?
        AURA_INTERRUPT_FLAG_UNK13 = 0x00002000,   // 13
        AURA_INTERRUPT_FLAG_UNK14 = 0x00004000,   // 14
        AURA_INTERRUPT_FLAG_UNK15 = 0x00008000,   // 15   removed by casting a spell?
        AURA_INTERRUPT_FLAG_UNK16 = 0x00010000,   // 16
        AURA_INTERRUPT_FLAG_MOUNTING = 0x00020000,   // 17   removed by mounting
        AURA_INTERRUPT_FLAG_NOT_SEATED = 0x00040000,   // 18   removed by standing up
        AURA_INTERRUPT_FLAG_CHANGE_MAP = 0x00080000,   // 19   leaving map/getting teleported
        AURA_INTERRUPT_FLAG_UNK20 = 0x00100000,   // 20
        AURA_INTERRUPT_FLAG_UNK21 = 0x00200000,   // 21
        AURA_INTERRUPT_FLAG_UNK22 = 0x00400000,   // 22
        AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT = 0x00800000,   // 23   removed by entering pvp combat
        AURA_INTERRUPT_FLAG_DIRECT_DAMAGE = 0x01000000    // 24   removed by any direct damage
    };

    public enum SpellModOp : uint
    {
        SPELLMOD_DAMAGE = 0,
        SPELLMOD_DURATION = 1,
        SPELLMOD_THREAT = 2,
        SPELLMOD_EFFECT1 = 3,
        SPELLMOD_CHARGES = 4,
        SPELLMOD_RANGE = 5,
        SPELLMOD_RADIUS = 6,
        SPELLMOD_CRITICAL_CHANCE = 7,
        SPELLMOD_ALL_EFFECTS = 8,
        SPELLMOD_NOT_LOSE_CASTING_TIME = 9,
        SPELLMOD_CASTING_TIME = 10,
        SPELLMOD_COOLDOWN = 11,
        SPELLMOD_EFFECT2 = 12,
        // spellmod 13 unused
        SPELLMOD_COST = 14,
        SPELLMOD_CRIT_DAMAGE_BONUS = 15,
        SPELLMOD_RESIST_MISS_CHANCE = 16,
        SPELLMOD_JUMP_TARGETS = 17,
        SPELLMOD_CHANCE_OF_SUCCESS = 18,
        SPELLMOD_ACTIVATION_TIME = 19,
        SPELLMOD_EFFECT_PAST_FIRST = 20,
        SPELLMOD_CASTING_TIME_OLD = 21,
        SPELLMOD_DOT = 22,
        SPELLMOD_EFFECT3 = 23,
        SPELLMOD_SPELL_BONUS_DAMAGE = 24,
        // spellmod 25, 26 unused
        SPELLMOD_MULTIPLE_VALUE = 27,
        SPELLMOD_RESIST_DISPEL_CHANCE = 28
    };

    public enum SpellFacingFlags : uint
    {
        SPELL_FACING_FLAG_INFRONT = 0x0001
    };

    // high byte (3 from 0..3) of UNIT_FIELD_BYTES_2
    public enum ShapeshiftForm : uint
    {
        FORM_NONE = 0x00,
        FORM_CAT = 0x01,
        FORM_TREE = 0x02,
        FORM_TRAVEL = 0x03,
        FORM_AQUA = 0x04,
        FORM_BEAR = 0x05,
        FORM_AMBIENT = 0x06,
        FORM_GHOUL = 0x07,
        FORM_DIREBEAR = 0x08,
        FORM_CREATUREBEAR = 0x0E,
        FORM_CREATURECAT = 0x0F,
        FORM_GHOSTWOLF = 0x10,
        FORM_BATTLESTANCE = 0x11,
        FORM_DEFENSIVESTANCE = 0x12,
        FORM_BERSERKERSTANCE = 0x13,
        FORM_TEST = 0x14,
        FORM_ZOMBIE = 0x15,
        FORM_FLIGHT_EPIC = 0x1B,
        FORM_SHADOW = 0x1C,
        FORM_FLIGHT = 0x1D,
        FORM_STEALTH = 0x1E,
        FORM_MOONKIN = 0x1F,
        FORM_SPIRITOFREDEMPTION = 0x20
    };

    // low byte ( 0 from 0..3 ) of UNIT_FIELD_BYTES_2
    public enum SheathState : uint
    {
        SHEATH_STATE_UNARMED = 0,                              // non prepared weapon
        SHEATH_STATE_MELEE = 1,                              // prepared melee weapon
        SHEATH_STATE_RANGED = 2                               // prepared ranged weapon
    };

    // byte (1 from 0..3) of UNIT_FIELD_BYTES_2
    public enum UnitBytes2_Flags : uint
    {
        UNIT_BYTE2_FLAG_UNK0 = 0x01,
        UNIT_BYTE2_FLAG_UNK1 = 0x02,
        UNIT_BYTE2_FLAG_UNK2 = 0x04,
        UNIT_BYTE2_FLAG_UNK3 = 0x08,
        UNIT_BYTE2_FLAG_AURAS = 0x10,                           // show possitive auras as positive, and allow its dispel
        UNIT_BYTE2_FLAG_UNK5 = 0x20,
        UNIT_BYTE2_FLAG_UNK6 = 0x40,
        UNIT_BYTE2_FLAG_UNK7 = 0x80
    };

    // byte (2 from 0..3) of UNIT_FIELD_BYTES_2
    public enum UnitRename : uint
    {
        UNIT_RENAME_NOT_ALLOWED = 0x02,
        UNIT_RENAME_ALLOWED = 0x03
    };

    public enum Swing : uint
    {
        NOSWING = 0,
        SINGLEHANDEDSWING = 1,
        TWOHANDEDSWING = 2
    };

    public enum VictimState : uint
    {
        VICTIMSTATE_UNKNOWN1 = 0,
        VICTIMSTATE_NORMAL = 1,
        VICTIMSTATE_DODGE = 2,
        VICTIMSTATE_PARRY = 3,
        VICTIMSTATE_INTERRUPT = 4,
        VICTIMSTATE_BLOCKS = 5,
        VICTIMSTATE_EVADES = 6,
        VICTIMSTATE_IS_IMMUNE = 7,
        VICTIMSTATE_DEFLECTS = 8
    };

    public enum HitInfo : uint
    {
        HITINFO_NORMALSWING = 0x00000000,
        HITINFO_UNK1 = 0x00000001,               // req correct packet structure
        HITINFO_NORMALSWING2 = 0x00000002,
        HITINFO_LEFTSWING = 0x00000004,
        HITINFO_UNK2 = 0x00000008,
        HITINFO_MISS = 0x00000010,
        HITINFO_ABSORB = 0x00000020,               // absorbed damage
        HITINFO_ABSORB2 = 0x00000040,               // absorbed damage
        HITINFO_RESIST = 0x00000080,               // resisted atleast some damage
        HITINFO_RESIST2 = 0x00000100,               // resisted atleast some damage
        HITINFO_CRITICALHIT = 0x00000200,               // critical hit
        // 0x00000400
        // 0x00000800
        // 0x00001000
        HITINFO_BLOCK = 0x00002000,               // blocked damage
        // 0x00004000
        // 0x00008000
        HITINFO_GLANCING = 0x00010000,
        HITINFO_CRUSHING = 0x00020000,
        HITINFO_NOACTION = 0x00040000,               // guessed
        // 0x00080000
        // 0x00100000
        HITINFO_SWINGNOHITSOUND = 0x00200000,               // guessed
        // 0x00400000
        HITINFO_UNK3 = 0x00800000
    };

    //i would like to remove this: (it is defined in item.h
    public enum InventorySlot : int
    {
        NULL_BAG = 0,
        NULL_SLOT = 255
    };

    public enum UnitModifierType : int
    {
        BASE_VALUE = 0,
        BASE_PCT = 1,
        TOTAL_VALUE = 2,
        TOTAL_PCT = 3,
        MODIFIER_TYPE_END = 4
    };

    public enum WeaponDamageRange : int
    {
        MINDAMAGE,
        MAXDAMAGE
    };

    public enum DamageTypeToSchool : int
    {
        RESISTANCE,
        DAMAGE_DEALT,
        DAMAGE_TAKEN
    };

    public enum AuraRemoveMode : int
    {
        AURA_REMOVE_BY_DEFAULT,
        AURA_REMOVE_BY_STACK,                                   // at replace by semillar aura
        AURA_REMOVE_BY_CANCEL,
        AURA_REMOVE_BY_DISPEL,
        AURA_REMOVE_BY_DEATH
    };

    public enum UnitMods : int
    {
        UNIT_MOD_STAT_STRENGTH,                                 // UNIT_MOD_STAT_STRENGTH..UNIT_MOD_STAT_SPIRIT must be in existed order, it's accessed by index values of Stats public enum .
        UNIT_MOD_STAT_AGILITY,
        UNIT_MOD_STAT_STAMINA,
        UNIT_MOD_STAT_INTELLECT,
        UNIT_MOD_STAT_SPIRIT,
        UNIT_MOD_HEALTH,
        UNIT_MOD_MANA,                                          // UNIT_MOD_MANA..UNIT_MOD_HAPPINESS must be in existed order, it's accessed by index values of Powers public enum .
        UNIT_MOD_RAGE,
        UNIT_MOD_FOCUS,
        UNIT_MOD_ENERGY,
        UNIT_MOD_HAPPINESS,
        UNIT_MOD_ARMOR,                                         // UNIT_MOD_ARMOR..UNIT_MOD_RESISTANCE_ARCANE must be in existed order, it's accessed by index values of SpellSchools public enum .
        UNIT_MOD_RESISTANCE_HOLY,
        UNIT_MOD_RESISTANCE_FIRE,
        UNIT_MOD_RESISTANCE_NATURE,
        UNIT_MOD_RESISTANCE_FROST,
        UNIT_MOD_RESISTANCE_SHADOW,
        UNIT_MOD_RESISTANCE_ARCANE,
        UNIT_MOD_ATTACK_POWER,
        UNIT_MOD_ATTACK_POWER_RANGED,
        UNIT_MOD_DAMAGE_MAINHAND,
        UNIT_MOD_DAMAGE_OFFHAND,
        UNIT_MOD_DAMAGE_RANGED,
        UNIT_MOD_END,
        // synonyms
        UNIT_MOD_STAT_START = UNIT_MOD_STAT_STRENGTH,
        UNIT_MOD_STAT_END = UNIT_MOD_STAT_SPIRIT + 1,
        UNIT_MOD_RESISTANCE_START = UNIT_MOD_ARMOR,
        UNIT_MOD_RESISTANCE_END = UNIT_MOD_RESISTANCE_ARCANE + 1,
        UNIT_MOD_POWER_START = UNIT_MOD_MANA,
        UNIT_MOD_POWER_END = UNIT_MOD_HAPPINESS + 1
    };

    public enum BaseModGroup : uint
    {
        CRIT_PERCENTAGE,
        RANGED_CRIT_PERCENTAGE,
        OFFHAND_CRIT_PERCENTAGE,
        SHIELD_BLOCK_VALUE,
        BASEMOD_END
    };

    public enum BaseModType : uint
    {
        FLAT_MOD,
        PCT_MOD
    };

    public enum DeathState : uint
    {
        ALIVE = 0,
        JUST_DIED = 1,
        CORPSE = 2,
        DEAD = 3,
        JUST_ALIVED = 4
    };

    public enum UnitState : uint
    {
        UNIT_STAT_DIED = 0x0001,
        UNIT_STAT_MELEE_ATTACKING = 0x0002,                     // player is melee attacking someone
        //UNIT_STAT_MELEE_ATTACK_BY = 0x0004,                     // player is melee attack by someone
        UNIT_STAT_STUNNED = 0x0008,
        UNIT_STAT_ROAMING = 0x0010,
        UNIT_STAT_CHASE = 0x0020,
        UNIT_STAT_SEARCHING = 0x0040,
        UNIT_STAT_FLEEING = 0x0080,
        UNIT_STAT_MOVING = (UNIT_STAT_ROAMING | UNIT_STAT_CHASE | UNIT_STAT_SEARCHING | UNIT_STAT_FLEEING),
        UNIT_STAT_IN_FLIGHT = 0x0100,                     // player is in flight mode
        UNIT_STAT_FOLLOW = 0x0200,
        UNIT_STAT_ROOT = 0x0400,
        UNIT_STAT_CONFUSED = 0x0800,
        UNIT_STAT_DISTRACTED = 0x1000,
        UNIT_STAT_ISOLATED = 0x2000,                     // area auras do not affect other players
        UNIT_STAT_ATTACK_PLAYER = 0x4000,
        UNIT_STAT_ALL_STATE = 0xffff                      //(UNIT_STAT_STOPPED | UNIT_STAT_MOVING | UNIT_STAT_IN_COMBAT | UNIT_STAT_IN_FLIGHT)
    };

    public enum UnitMoveType : uint
    {
        MOVE_WALK = 0,
        MOVE_RUN = 1,
        MOVE_WALKBACK = 2,
        MOVE_SWIM = 3,
        MOVE_SWIMBACK = 4,
        MOVE_TURN = 5,
        MOVE_FLY = 6,
        MOVE_FLYBACK = 7
    };

    public enum WeaponAttackType : uint
    {
        BASE_ATTACK = 0,
        OFF_ATTACK = 1,
        RANGED_ATTACK = 2
    };

    public enum CombatRating : uint
    {
        CR_WEAPON_SKILL = 0,
        CR_DEFENSE_SKILL = 1,
        CR_DODGE = 2,
        CR_PARRY = 3,
        CR_BLOCK = 4,
        CR_HIT_MELEE = 5,
        CR_HIT_RANGED = 6,
        CR_HIT_SPELL = 7,
        CR_CRIT_MELEE = 8,
        CR_CRIT_RANGED = 9,
        CR_CRIT_SPELL = 10,
        CR_HIT_TAKEN_MELEE = 11,
        CR_HIT_TAKEN_RANGED = 12,
        CR_HIT_TAKEN_SPELL = 13,
        CR_CRIT_TAKEN_MELEE = 14,
        CR_CRIT_TAKEN_RANGED = 15,
        CR_CRIT_TAKEN_SPELL = 16,
        CR_HASTE_MELEE = 17,
        CR_HASTE_RANGED = 18,
        CR_HASTE_SPELL = 19,
        CR_WEAPON_SKILL_MAINHAND = 20,
        CR_WEAPON_SKILL_OFFHAND = 21,
        CR_WEAPON_SKILL_RANGED = 22,
        CR_EXPERTISE = 23
    };

    public enum DamageEffectType : uint
    {
        DIRECT_DAMAGE = 0,                            // used for normal weapon damage (not for class abilities or spells)
        SPELL_DIRECT_DAMAGE = 1,                            // spell/class abilities damage
        DOT = 2,
        HEAL = 3,
        NODAMAGE = 4,                            // used also in case when damage applied to health but not applied to spell channelInterruptFlags/etc
        SELF_DAMAGE = 5
    };

    public enum UnitVisibility : uint
    {
        VISIBILITY_OFF = 0,                      // absolute, not detectable, GM-like, can see all other
        VISIBILITY_ON = 1,
        VISIBILITY_GROUP_STEALTH = 2,                      // detect chance, seen and can see group members
        VISIBILITY_GROUP_INVISIBILITY = 3,                      // invisibility, can see and can be seen only another invisible unit or invisible detection unit, set only if not stealthed, and in checks not used (mask used instead)
        VISIBILITY_GROUP_NO_DETECT = 4,                      // state just at stealth apply for update Grid state. Don't remove, otherwise stealth spells will break
        VISIBILITY_RESPAWN = 5                       // special totally not detectable visibility for force delete object at respawn command
    };

    // Value masks for UNIT_FIELD_FLAGS
    public enum UnitFlags : uint
    {
        UNIT_FLAG_UNK_0 = 0x00000001,
        UNIT_FLAG_NON_ATTACKABLE = 0x00000002,           // not attackable
        UNIT_FLAG_DISABLE_MOVE = 0x00000004,
        UNIT_FLAG_PVP_ATTACKABLE = 0x00000008,           // allow apply pvp rules to attackable state in addition to faction dependent state
        UNIT_FLAG_RENAME = 0x00000010,
        UNIT_FLAG_PREPARATION = 0x00000020,           // don't take reagents for spells with SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP
        UNIT_FLAG_UNK_6 = 0x00000040,
        UNIT_FLAG_NOT_ATTACKABLE_1 = 0x00000080,           // ?? (UNIT_FLAG_PVP_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1) is NON_PVP_ATTACKABLE
        UNIT_FLAG_OOC_NOT_ATTACKABLE = 0x00000100,           // 2.0.8 - (OOC Out Of Combat) Can not be attacked when not in combat. Removed if unit for some reason enter combat.
        UNIT_FLAG_UNK_9 = 0x00000200,           // 3.0.3 - makes you unable to attack everything
        UNIT_FLAG_LOOTING = 0x00000400,           // loot animation
        UNIT_FLAG_PET_IN_COMBAT = 0x00000800,           // in combat?, 2.0.8
        UNIT_FLAG_PVP = 0x00001000,           // changed in 3.0.3
        UNIT_FLAG_SILENCED = 0x00002000,           // silenced, 2.1.1
        UNIT_FLAG_UNK_14 = 0x00004000,           // 2.0.8
        UNIT_FLAG_UNK_15 = 0x00008000,
        UNIT_FLAG_UNK_16 = 0x00010000,           // removes attackable icon
        UNIT_FLAG_PACIFIED = 0x00020000,           // 3.0.3 ok
        UNIT_FLAG_STUNNED = 0x00040000,           // 3.0.3 ok
        UNIT_FLAG_IN_COMBAT = 0x00080000,
        UNIT_FLAG_TAXI_FLIGHT = 0x00100000,           // disable casting at client side spell not allowed by taxi flight (mounted?), probably used with 0x4 flag
        UNIT_FLAG_DISARMED = 0x00200000,           // 3.0.3, disable melee spells casting..., "Required melee weapon" added to melee spells tooltip.
        UNIT_FLAG_CONFUSED = 0x00400000,
        UNIT_FLAG_FLEEING = 0x00800000,
        UNIT_FLAG_PLAYER_CONTROLLED = 0x01000000,           // used in spell Eyes of the Beast for pet... let attack by controlled creature
        UNIT_FLAG_NOT_SELECTABLE = 0x02000000,
        UNIT_FLAG_SKINNABLE = 0x04000000,
        UNIT_FLAG_MOUNT = 0x08000000,
        UNIT_FLAG_UNK_28 = 0x10000000,
        UNIT_FLAG_UNK_29 = 0x20000000,           // used in Feing Death spell
        UNIT_FLAG_SHEATHE = 0x40000000,
        UNIT_FLAG_UNK_31 = 0x80000000            // set skinnable icon and also changes color of portrait
    };

    // Value masks for UNIT_FIELD_FLAGS_2
    public enum UnitFlags2 : uint
    {
        UNIT_FLAG2_FEIGN_DEATH = 0x00000001,
        UNIT_FLAG2_UNK1 = 0x00000002,               // Hide unit model (show only player equip)
        UNIT_FLAG2_COMPREHEND_LANG = 0x00000008,
        UNIT_FLAG2_FORCE_MOVE = 0x00000040,
        UNIT_FLAG2_REGENERATE_POWER = 0x00000800
    };

    /// Non Player Character flags
    public enum NPCFlags : uint
    {
        UNIT_NPC_FLAG_NONE = 0x00000000,
        UNIT_NPC_FLAG_GOSSIP = 0x00000001,       // 100%
        UNIT_NPC_FLAG_QUESTGIVER = 0x00000002,       // guessed, probably ok
        UNIT_NPC_FLAG_UNK1 = 0x00000004,
        UNIT_NPC_FLAG_UNK2 = 0x00000008,
        UNIT_NPC_FLAG_TRAINER = 0x00000010,       // 100%
        UNIT_NPC_FLAG_TRAINER_CLASS = 0x00000020,       // 100%
        UNIT_NPC_FLAG_TRAINER_PROFESSION = 0x00000040,       // 100%
        UNIT_NPC_FLAG_VENDOR = 0x00000080,       // 100%
        UNIT_NPC_FLAG_VENDOR_AMMO = 0x00000100,       // 100%, general goods vendor
        UNIT_NPC_FLAG_VENDOR_FOOD = 0x00000200,       // 100%
        UNIT_NPC_FLAG_VENDOR_POISON = 0x00000400,       // guessed
        UNIT_NPC_FLAG_VENDOR_REAGENT = 0x00000800,       // 100%
        UNIT_NPC_FLAG_REPAIR = 0x00001000,       // 100%
        UNIT_NPC_FLAG_FLIGHTMASTER = 0x00002000,       // 100%
        UNIT_NPC_FLAG_SPIRITHEALER = 0x00004000,       // guessed
        UNIT_NPC_FLAG_SPIRITGUIDE = 0x00008000,       // guessed
        UNIT_NPC_FLAG_INNKEEPER = 0x00010000,       // 100%
        UNIT_NPC_FLAG_BANKER = 0x00020000,       // 100%
        UNIT_NPC_FLAG_PETITIONER = 0x00040000,       // 100% 0xC0000 = guild petitions, 0x40000 = arena team petitions
        UNIT_NPC_FLAG_TABARDDESIGNER = 0x00080000,       // 100%
        UNIT_NPC_FLAG_BATTLEMASTER = 0x00100000,       // 100%
        UNIT_NPC_FLAG_AUCTIONEER = 0x00200000,       // 100%
        UNIT_NPC_FLAG_STABLEMASTER = 0x00400000,       // 100%
        UNIT_NPC_FLAG_GUILD_BANKER = 0x00800000,       // cause client to send 997 opcode
        UNIT_NPC_FLAG_SPELLCLICK = 0x01000000,       // cause client to send 1015 opcode (spell click)
        UNIT_NPC_FLAG_GUARD = 0x10000000,       // custom flag for guards
    };

    //public enum MonsterMovementFlags : uint
    //{
    //    MONSTER_MOVE_NONE = 0x00000000,
    //    MONSTER_MOVE_FORWARD = 0x00000001,
    //    MONSTER_MOVE_BACKWARD = 0x00000002,
    //    MONSTER_MOVE_STRAFE_LEFT = 0x00000004,
    //    MONSTER_MOVE_STRAFE_RIGHT = 0x00000008,
    //    MONSTER_MOVE_LEFT = 0x00000010,               // turn
    //    MONSTER_MOVE_RIGHT = 0x00000020,               // turn
    //    MONSTER_MOVE_PITCH_UP = 0x00000040,
    //    MONSTER_MOVE_PITCH_DOWN = 0x00000080,
    //    MONSTER_MOVE_TELEPORT = 0x00000100,
    //    MONSTER_MOVE_TELEPORT2 = 0x00000200,
    //    MONSTER_MOVE_LEVITATING = 0x00000400,
    //    MONSTER_MOVE_UNK1 = 0x00000800,               // float+uint32
    //    MONSTER_MOVE_WALK = 0x00001000,               // run2?
    //    MONSTER_MOVE_SPLINE = 0x00002000,               // spline n*(float x,y,z)
    //    // 0x4000, 0x8000, 0x10000, 0x20000 run
    //    MONSTER_MOVE_SPLINE2 = 0x00040000,               // spline n*(float x,y,z)
    //    MONSTER_MOVE_UNK2 = 0x00080000,               // used for flying mobs
    //    MONSTER_MOVE_UNK3 = 0x00100000,               // used for flying mobs
    //    MONSTER_MOVE_UNK4 = 0x00200000,               // uint8+uint32
    //    MONSTER_MOVE_UNK5 = 0x00400000,               // run in place, then teleport to final point
    //    MONSTER_MOVE_UNK6 = 0x00800000,               // teleport
    //    MONSTER_MOVE_UNK7 = 0x01000000,               // run
    //    MONSTER_MOVE_FLY = 0x02000000,               // swimming/flying (depends on mob?)
    //    MONSTER_MOVE_UNK9 = 0x04000000,               // run
    //    MONSTER_MOVE_UNK10 = 0x08000000,               // run
    //    MONSTER_MOVE_UNK11 = 0x10000000,               // run
    //    MONSTER_MOVE_UNK12 = 0x20000000,               // run
    //    MONSTER_MOVE_UNK13 = 0x40000000,               // levitating

    //    // masks
    //    MONSTER_MOVE_SPLINE_FLY = 0x00003000,               // fly by points
    //}

    //public enum MovementFlags : uint
    //{
    //    MOVEMENTFLAG_NONE = 0x00000000,
    //    MOVEMENTFLAG_FORWARD = 0x00000001,
    //    MOVEMENTFLAG_BACKWARD = 0x00000002,
    //    MOVEMENTFLAG_STRAFE_LEFT = 0x00000004,
    //    MOVEMENTFLAG_STRAFE_RIGHT = 0x00000008,
    //    MOVEMENTFLAG_LEFT = 0x00000010,
    //    MOVEMENTFLAG_RIGHT = 0x00000020,
    //    MOVEMENTFLAG_PITCH_UP = 0x00000040,
    //    MOVEMENTFLAG_PITCH_DOWN = 0x00000080,
    //    MOVEMENTFLAG_WALK_MODE = 0x00000100,               // Walking
    //    MOVEMENTFLAG_ONTRANSPORT = 0x00000200,               // Used for flying on some creatures
    //    MOVEMENTFLAG_LEVITATING = 0x00000400,
    //    MOVEMENTFLAG_FLY_UNK1 = 0x00000800,
    //    MOVEMENTFLAG_JUMPING = 0x00001000,
    //    MOVEMENTFLAG_UNK4 = 0x00002000,
    //    MOVEMENTFLAG_FALLING = 0x00004000,
    //    // 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000
    //    MOVEMENTFLAG_SWIMMING = 0x00200000,               // appears with fly flag also
    //    MOVEMENTFLAG_FLY_UP = 0x00400000,
    //    MOVEMENTFLAG_CAN_FLY = 0x00800000,
    //    MOVEMENTFLAG_FLYING = 0x01000000,
    //    MOVEMENTFLAG_FLYING2 = 0x02000000,               // Actual flying mode
    //    MOVEMENTFLAG_SPLINE = 0x04000000,               // used for flight paths
    //    MOVEMENTFLAG_SPLINE2 = 0x08000000,               // used for flight paths
    //    MOVEMENTFLAG_WATERWALKING = 0x10000000,               // prevent unit from falling through water
    //    MOVEMENTFLAG_SAFE_FALL = 0x20000000,               // active rogue safe fall spell (passive)
    //    MOVEMENTFLAG_UNK3 = 0x40000000
    //};

    public enum DiminishingLevels : uint
    {
        DIMINISHING_LEVEL_1 = 0,
        DIMINISHING_LEVEL_2 = 1,
        DIMINISHING_LEVEL_3 = 2,
        DIMINISHING_LEVEL_IMMUNE = 3
    };

    public enum MeleeHitOutcome : uint
    {
        MELEE_HIT_EVADE, MELEE_HIT_MISS, MELEE_HIT_DODGE, MELEE_HIT_BLOCK, MELEE_HIT_PARRY,
        MELEE_HIT_GLANCING, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_NORMAL, MELEE_HIT_BLOCK_CRIT
    };

    public enum CurrentSpellTypes : uint
    {
        CURRENT_MELEE_SPELL = 0,
        CURRENT_FIRST_NON_MELEE_SPELL = 1,                      // just counter
        CURRENT_GENERIC_SPELL = 1,
        CURRENT_AUTOREPEAT_SPELL = 2,
        CURRENT_CHANNELED_SPELL = 3,
        CURRENT_MAX_SPELL = 4                                   // just counter
    };

    public enum ActiveStates : uint
    {
        ACT_ENABLED = 0xC100,
        ACT_DISABLED = 0x8100,
        ACT_COMMAND = 0x0700,
        ACT_REACTION = 0x0600,
        ACT_CAST = 0x0100,
        ACT_PASSIVE = 0x0000,
        ACT_DECIDE = 0x0001
    };

    public enum ReactStates : uint
    {
        REACT_PASSIVE = 0,
        REACT_DEFENSIVE = 1,
        REACT_AGGRESSIVE = 2
    };

    public enum CommandStates : uint
    {
        COMMAND_STAY = 0,
        COMMAND_FOLLOW = 1,
        COMMAND_ATTACK = 2,
        COMMAND_ABANDON = 3
    };



    public enum ReactiveType : uint
    {
        REACTIVE_DEFENSE = 1,
        REACTIVE_HUNTER_PARRY = 2,
        REACTIVE_CRIT = 3,
        REACTIVE_HUNTER_CRIT = 4,
        REACTIVE_OVERPOWER = 5
    };




}
